package dao;

import entity.*;
import java.io.Serializable;
import java.util.Collection;
import java.util.List;

/**
 * Интерфейс, определяющий типизированный Data Access Object (DAO) для
 * классов-сущностей проекта
 *
 * @author UNI\kgp
 * @param <T> класс-сущность
 * @param <K> тип поля, представляющего первичный ключ класса-сущности
 */
public interface GenericDAO<T, K extends Serializable> {

    /**
     * Добавляет объект класса-сущности T
     *
     * @param entity добавляемый объект класса-сущности
     */
    public void add(T entity) throws Exception;

    /**
     * Удаляет объект класса-сузщности T
     *
     * @param entity удаляемый объект класса-сущности
     */
    public void delete(T entity) throws Exception;

    /**
     * Обновляет объект класса-сузщности T
     *
     * @param entity удаляемый объект класса-сущности
     */
    public void update(T entity) throws Exception;

    /**
     * Возвращает объект класса Т с значением первичного ключа, равным id
     *
     * @param id значение первичного ключа обновляемого объекта
     * @return объект класса Т
     */
    public T getById(K id) throws Exception;

    /**
     * Возвращает объект T связаный с указаным Phone
     *
     * @param phone
     * @return коллекцию объектов класса-сущности
     */
    public T getByPhone(Phone phone) throws Exception;

    public PhoneType getByPhoneTypeByName(String name) throws Exception;

    /**
     * Возвращает коллекцию объектов T связаных с указаным Room
     *
     * @param room
     * @return
     */
    public Collection<T> getByRoom(Room room) throws Exception;

    /**
     * Возвращает коллекцию объектов T связаных с указаным Person
     *
     * @param person
     * @return
     */
    public Collection<T> getByPerson(Person person) throws Exception;

    /**
     * Возвращает коллекцию объектов T связанных с передаваемым orgUnit
     *
     * @param orgUnit
     * @return
     */
    public Collection<T> getByOrgUnit(OrgUnit orgUnit) throws Exception;

    /**
     * Возвращает родитель объекта OrgUnit, null для высшего объекта иерархии.
     *
     * @param orgUnit
     * @return родитель OrgUnit
     */
    public OrgUnit getParent(OrgUnit orgUnit) throws Exception;

    /**
     * Возвращает коллекциою объектов OrgUnit по заданому типу
     *
     * @param out
     * @return коллекция OrgUnit
     */
    public Collection<OrgUnit> getByOrgUnitType(OrgUnitType out) throws Exception;

    /**
     * Возвращает OrgUnitPost по OrgUnitPost
     *
     * @param out
     * @return коллекция OrgUnit
     */
    public OrgUnitPost getOrgUnitPostByOrgUnitPost(OrgUnitPost oup) throws Exception;

    /**
     * Возвращает коллекцию из всех объектов указаного типа.
     *
     * @return
     */
    public Collection<T> getAll() throws Exception;

    /**
     * Выполняет поиск по имени
     *
     * @return
     * @throws Exception
     */
    public Collection<OrgUnitPost> searchByName(String name) throws Exception;

    /**
     * Выполняет поиск по номеру телефона
     *
     * @return
     * @throws Exception
     */
    public Collection<OrgUnitPost> searchByPhone(String phone) throws Exception;

    /**
     * Выполняет поиск по аудитории
     *
     * @return
     * @throws Exception
     */
    public Collection<OrgUnitPost> searchByRoom(String room) throws Exception;

    public List<Post> getByPost(Post postEntity) throws Exception;

    public User getUserByName(String name) throws Exception;

    public User getUserById(Long id) throws Exception;

    public String getPasswordDigest(String password) throws Exception;
    
    public void addUser(User user) throws Exception;;
}
